home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 3 / Gekikoh Dennoh Club Vol. 3 (Japan).7z / Gekikoh Dennoh Club Vol. 3 (Japan) (Track 1).bin / games / rifler / c / src.lzh / Rifler_m.c < prev    next >
Text File  |  1997-12-21  |  5KB  |  192 lines

  1. /*                                        
  2.         Rifle the ancient remains
  3.             「古跡盗掘」
  4.             Rifleh_m.h    monster etc.
  5.                         BY SJOM
  6.                                         
  7. */
  8.  
  9. #include "Rifler.h"
  10.  
  11.  
  12.  
  13. static RANGE monster_range_wall[10]={
  14.     { 1,9,13,6 },    /* green slime */
  15.     { 1,9,13,6 },    /* redslime */
  16.     { 1,9,13,6 },    /* blue slime */
  17.     { 1,5,13,10 },    /* dark slime */
  18.     { 2,1,12,14 },    /* blue bat */
  19.     { 2,1,12,14 },    /* black bat */
  20.     { 0,5,15,10 },    /* zombie */
  21.     { 0,5,15,10 },    /* ghoul */
  22.     { 0,0,15,15 },    /* skeleton */
  23.     { 0,3,15,12 }    /* gargoyle */
  24. };
  25.  
  26.  
  27. static DIRECTION dir_dir[4]={
  28.     { 1,0,0 },
  29.     { 0,1,1 },
  30.     { -1,0,2 },
  31.     { 0,-1,3 }
  32. };
  33.  
  34.  
  35. static struct {
  36.     int prob;
  37.     int kind;
  38.     int speed;
  39.     int count;
  40.     int se;
  41. } effector_set[10]={
  42.     { no,0,0,0,no },            /* green slime */
  43.     { no,0,0,0,no },            /* blue slime */
  44.     { 400,0,1,3*16,spit_rot },        /* red slime */
  45.     { 320,0,1,4*16,spit_rot },        /* black slime */
  46.     { 300,1,2,16*16/3,supersound },        /* blue bat */
  47.     { 260,1,2,32*16/3,supersound },        /* black bat */
  48.     { 280,0,1,6*16,spit_rot },        /* zombie */
  49.     { 240,2,1,8*16,spit_digester },        /* ghoul */
  50.     { 200,3,1,32*16,cursed_breath },    /* skeleton */
  51.     { 180,4,4,32*16/4,lightning_bolt }    /* gargoyle */
  52. };
  53.  
  54.  
  55. static void
  56. make_effector(int mons_no)
  57. {
  58.     int loop;
  59.     int kind=monster[mons_no].kind;
  60.     if (kind<2)
  61.         return;
  62.     if ((overlap_bg_wall(monster[mons_no].pos.x+dir_dir[monster[mons_no].dir].x*8,
  63.        monster[mons_no].pos.y+dir_dir[monster[mons_no].dir].y*8,&monster_range_wall[kind])) && (kind!=9))
  64.         return;
  65.     if (rnd_mul16(effector_set[kind].prob)==yes) {
  66.         for (loop=0;loop<max_effector;loop++)
  67.             if (effector[loop].alive==no) {
  68.                 se(effector_set[kind].se);
  69.                 effector[loop].pos=monster[mons_no].pos;
  70.                 effector[loop].alive=yes;
  71.                 effector[loop].kind=effector_set[kind].kind;
  72.                 effector[loop].dir=monster[mons_no].dir;
  73.                 effector[loop].speed=effector_set[kind].speed;
  74.                 effector[loop].count=effector_set[kind].count;
  75.                 return;
  76.             };
  77.     };
  78. }
  79.  
  80.  
  81. static int monster_scope[4]={ 4*16,6*16,8*16,16*16 };
  82.  
  83.  
  84. void
  85. move_monster(void)
  86. {
  87.     int loop;
  88.     if (monster_no is_nothing)
  89.         return;
  90.     for (loop=0;loop<monster_no;loop++) {
  91.         if (monster[loop].hp) {
  92.             POSITION sub=monster[loop].pos;
  93.             DIRECTION adsb;
  94.             make_effector(loop);
  95.             if (++monster[loop].sp_count>=monster[loop].speed) {
  96.                 int kind=monster[loop].kind;
  97.                 monster[loop].sp_count=0;
  98.                 switch (kind) {
  99.                 case 0:        /* green slime */
  100.                 case 1:        /* blue slime */
  101.                 case 2:        /* red slime */
  102.                 case 3:        /* dark slime */
  103.                 case 4:        /* blue bat */
  104.                 case 5:        /* black bat */
  105.                     if (monster[loop].sub) {
  106.                         adsb=dir_dir[monster[loop].dir];
  107.                         monster[loop].sub--;
  108.                     } else {
  109.                         adsb=*calc_dir8(&monster[loop].pos,&game_player.pos);
  110.                         monster[loop].dir=adsb.dir/2;
  111.                     };
  112.                     if (++monster[loop].count>=6*2)
  113.                         monster[loop].count=0;
  114.                     break;
  115.                 case 6:        /* zombie */
  116.                 case 7:        /* ghoul */
  117.                 case 8:        /* skeleton */
  118.                 case 9:        /* gargoyle */
  119.                     if (monster[loop].sub) {
  120.                         adsb=dir_dir[monster[loop].dir];
  121.                         monster[loop].sub--;
  122.                     } else {
  123.                         monster[loop].sub=4+rnd_mul16(16);
  124.                         if (scope(&monster[loop].pos,&game_player.pos,monster_scope[kind-6]))
  125.                             adsb=*calc_dir_axis(&monster[loop].pos,&game_player.pos);
  126.                         else
  127.                             adsb=dir_dir[rnd_mul16(4)];
  128.                         monster[loop].dir=adsb.dir;
  129.                     };
  130.                     if (++monster[loop].count>=16)
  131.                         monster[loop].count=0;
  132.                     break;
  133.                 case 10:    /* will 'o' the wisp */
  134.                     break;
  135.                 };
  136.                 sub.x+=adsb.x;
  137.                 sub.y+=adsb.y;
  138.                 if (!(overlap_bg_wall(sub.x,sub.y,&monster_range_wall[kind])))
  139.                     monster[loop].pos=sub;
  140.                 else {
  141.                     monster[loop].dir=(monster[loop].dir+rnd_mul16(3)+1) & 3;
  142.                     monster[loop].sub=4+rnd_mul16(16);
  143.                 };
  144.             };
  145.         };
  146.     };
  147.     monster_sp_set();
  148. }
  149.  
  150.  
  151. static RANGE eff_range_wall={ 2,2,13,13 };
  152.  
  153. void
  154. move_effector(void)
  155. {
  156.     int loop;
  157.     if (monster_no is_nothing)
  158.         return;
  159.     for (loop=0;loop<max_effector;loop++) {
  160.         if (effector[loop].alive) {
  161.             DIRECTION adsb;
  162.             if (--effector[loop].count==0) {
  163.                 effector[loop].alive=no;
  164.             } else {
  165.                 int kind=effector[loop].kind;
  166.                 switch (kind) {
  167.                 case 0:        /* rot */
  168.                 case 1:        /* supersonic */
  169.                 case 2:        /* digester */
  170.                     adsb=dir_dir[effector[loop].dir];
  171.                     break;
  172.                 case 3:        /* cursed breath */
  173.                     adsb=*calc_dir_axis(&effector[loop].pos,&game_player.pos);
  174.                     break;
  175.                 case 4:        /* lightning bolt */
  176.                     adsb=*calc_dir8(&effector[loop].pos,&game_player.pos);
  177.                     break;
  178.                 };
  179.                 effector[loop].pos.x+=adsb.x*effector[loop].speed;
  180.                 effector[loop].pos.y+=adsb.y*effector[loop].speed;
  181.                 if (kind!=4)
  182.                     if (overlap_bg_wall(effector[loop].pos.x,
  183.                        effector[loop].pos.y,&eff_range_wall))
  184.                         effector[loop].alive=no;
  185.             };
  186.         };
  187.     };
  188.     effector_sp_set();
  189. }
  190.  
  191.  
  192.